class AmistadesController < ApplicationController
  before_filter :login_required

  # Lista paginada de las amistades aceptadas
  def index
    @amistades = current_usuario.amigos_accesibles
    @num_amistades = @amistades.size
    
    order = params[:order] + " " + params[:tipo] if params[:order] && params[:tipo]
    order = "login ASC" if params[:order].blank?
    @amistades = @amistades.paginate(:page => params[:page], :per_page => 10, :order => order)
        
    Evento.update_all("visto = 1", ["tipo like ? and usuario_id = ?", "an-rechazado%", current_usuario])

    respond_to do |format|
      format.html 
    end
  end
  
  # Metodo común para las acciones show y público
  def show_refact
    @regalos = current_usuario.regalos_recibidos.paginate_all_by_remitente_id(@amigo.id, :page => params[:page], :per_page => 3)
    @num_regalos = current_usuario.regalos_recibidos.count(:all, :conditions => ["remitente_id = ?", @amigo.id])
    @amistad = Amistad.find_by_usuario_id_and_amigo_id(current_usuario, @amigo)
    @preferido = TipoRegalo.find(@amigo.perfil.preferido) if @amigo.perfil && @amigo.perfil.preferido
    
    Evento.update_all("visto = true", ["usuario_id = ? and amigo_id = ?", current_usuario.id, @amigo.id])
        
    if Recordatorio.find_by_usuario_id_and_amigo_id(current_usuario, @amigo)
      @recordar = "checked"
    end
  end
 
  # Muestra el perfil de un usuario. Si es amigo, mostrará su perfil extendido/privado, en
  # caso contrario mostrará el público.
  def show    
    begin
      @amigo = current_usuario.amigos_accesibles.find(Usuario.find_by_login(params[:id]))
    rescue
      @amigo = nil
    end
      
    respond_to do |format|
      format.html do
        @amigo == nil ? redirect_to(publico_usuario_amigo_path(current_usuario.login, params[:id])) : show_refact
      end
    end
  end
   
  # Muestra el perfil público de un usuario.
  def publico
    @amigo = Usuario.find_by_login(params[:id])
    show_refact  
    
    respond_to do |format|  
      format.html {}
    end
  end

  # Crea la relación entre dos usuarios. El estado será 'pendiente' en ambos sentidos.
  def peticion 
    Amistad.peticion(current_usuario, Usuario.find(params[:amigo].to_i)) 
    flash[:notice] = "Peticion de amistad creada con éxito" 
    flash[:alert] = "Debes esperar a que el otro usuario acepte tu petición y entonces seréis amigos ;-)" 
    
    respond_to do |format|
      format.html { redirect_to usuario_home_path(current_usuario.login) }
    end
  end

  # Actualiza el estado de una relacion.
  def update
    amigo = Usuario.find(params[:id])

    if params[:accion] == "Aceptar"
        Amistad.aceptar(amigo, current_usuario)
        flash[:notice] = '¡ Ya sois amigos !'
        redirect_to usuario_amigo_path(current_usuario.login, amigo.login)
    elsif params[:accion] == "Rechazar"
        Amistad.rechazar(amigo, current_usuario)
        flash[:error] = "¡ Lo has rechazado como amigo !"
        redirect_to usuario_amigos_path(current_usuario.login)          
    elsif params[:accion] == "Eliminar amigo"
        Amistad.rechazar(amigo, current_usuario)
        flash[:error] = "¡ Lo has eliminado como amigo !"
        redirect_to usuario_amigos_path(current_usuario.login)          
    end
  end
  
  # Acción que muestra el buscador de amigos.
  def buscar
    respond_to do |format|
      format.html
    end
  end

  # Acción que muestra los resultados de una búsqueda.
  def resultados 
    amistad = {}
    if params[:page].not.blank?
      [:hombre, :mujer, :edad_ini, :edad_fin, :poblacion].each do |option|
        amistad[option] = params[option]
      end
    else
      amistad = params[:amistad]
    end  
    
    @resultados = buscador(amistad, current_usuario, params[:page])

    respond_to do |format|
      format.html
    end       
  end

  # Metodo que permite a un usuario activar o desactivar recordar las fechas
  # importantes de otro usuario
  def recordar
    usuario = Usuario.find_by_login(params[:usuario])
    amigo = Usuario.find_by_login(params[:id])
    recordatorio = Recordatorio.find_by_usuario_id_and_amigo_id(usuario, amigo)    
    recordatorio ? recordatorio.destroy : Recordatorio.create(:usuario => usuario, :amigo => amigo)
  end
  
  # Listado de los cumpleaños de mis amigos  
  def cumpleanios
    @cumpleanios_meses = (current_usuario.amigos_accesibles.group_by {|amigo| 
       tipo = TipoCelebracion.find_by_nombre("El día que nací")
       cumpleanio = amigo.celebraciones.find_by_tipo_celebracion_id(tipo)
       [cumpleanio.fecha.month, cumpleanio.fecha.day] if cumpleanio
    })
    @cumpleanios_meses = @cumpleanios_meses.delete_if {|k,v| k.nil?}
    @cumpleanios_meses = @cumpleanios_meses.sort
  end

  # Metodo ajax que hace una búsqueda dinámica de usuarios por login.
  def live_search
    if params[:busqueda] != ""
      encontrados = Usuario.find(:all, :conditions => [ 'LOWER(login) LIKE ? AND visible = 1 AND quiero_ser_amigo = 1', 
                                  '%' + params[:busqueda].downcase + '%' ], :limit => 11, :order => "login asc")

      @usuarios = encontrados - current_usuario.amigos_aceptados - current_usuario.to_a
    end
    
    render :layout => false
  end
  
protected
  # La lógica de búsqueda 
  def buscador(datos, usuario, page)
    sexo = poblacion = "%"
    
    sexo = "h" if datos[:hombre] == "1" && datos[:mujer] == "0"
    sexo = "m" if datos[:hombre] == "0" && datos[:mujer] == "1"  
    poblacion = datos[:poblacion] if datos[:poblacion].not.blank?
    usuario = Usuario.find(usuario)
    sql = "sexo LIKE ? AND poblacion LIKE ? AND usuario_id != ? AND login != 'admin' AND visible = 1 AND quiero_ser_amigo = 1"
    
    if datos[:edad_ini].not.blank? && datos[:edad_fin].not.blank?
      fecha_inicial = Time.now.year - (datos[:edad_ini].to_i) 
      fecha_final = Time.now.year - (datos[:edad_fin].to_i)
      
      resultados = Perfil.paginate(:all, :conditions => [sql + " AND date_format(fecha_nacimiento, \"%Y\") <= ? AND 
        date_format(fecha_nacimiento, \"%Y\") >= ?", sexo, poblacion, usuario, fecha_inicial, fecha_final], 
        :order => 'login', :include => [:usuario], :page => page, :per_page => 12)
    else
      resultados = Perfil.paginate(:all, :conditions => [sql, sexo, poblacion, usuario], 
        :order => 'login', :include => [:usuario], :page => page, :per_page => 12)
    end
  end
end

